﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using InnvoiceActual.Logica.GestorObject;
using InnvoiceActual.BaseDeDatos.innvoicedbDataSetTableAdapters;
using MySql.Data.MySqlClient;
using System.Windows;
using System.Data;
using InnvoiceActual.Logica.GestorObject.Articulo;

namespace InnvoiceActual.Logica.GestorDB.RemitoDB
{
    public class ItemRemitoDB
    {
        #region Property

        EmpresaCS empresa = EmpresaCS.Instance;

        ArticuloDB articuloDB = new ArticuloDB();

        #endregion

        #region CRUD Methods

        public void AddItemsRemito(List<ItemRemito> itemsRemito)
        {
            int resultadoConsulta;

            item_remitoTableAdapter itemRemitoTB = new item_remitoTableAdapter();

            itemRemitoTB.Connection.Open();
            MySqlTransaction transaccion = itemRemitoTB.Connection.BeginTransaction();

            try
            {
                int contador = 1;

                foreach (ItemRemito itemRemito in itemsRemito)
                {
                    int codigoEmpresa = itemRemito.CodigoEmpresa;
                    int nroComprobante1 = itemRemito.NroComprobante1;
                    int nroComprobante2 = itemRemito.NroComprobante2;
                    byte codigoTipo = itemRemito.CodigoTipo;

                    int codigoCategoriaArticulo = itemRemito.CodigoCategoriaArticulo;
                    int codigoArticulo = itemRemito.CodigoArticulo;
                    int codigoSubArticulo = itemRemito.CodigoSubArticulo;

                    decimal cantidad = Convert.ToDecimal(itemRemito.Cantidad);
                    decimal precioUnitario = itemRemito.PrecioUnitario;
                    decimal iva = Convert.ToDecimal(itemRemito.Iva);
                    int pos = contador;

                    contador++;

                    resultadoConsulta = itemRemitoTB.InsertItemRemito(codigoEmpresa, (short)nroComprobante1, nroComprobante2, codigoTipo, (short)codigoCategoriaArticulo, (short)codigoArticulo, (short)codigoSubArticulo, cantidad, precioUnitario, iva,pos);

                }

                transaccion.Commit();
            }
            catch (Exception e)
            {
                transaccion.Rollback();
                MessageBox.Show("Error AddItemsRemito - ItemRemitoDB" + e.Message, "Cuidado", MessageBoxButton.OK);
            }
            finally
            {
                itemRemitoTB.Connection.Close();
            }
        }

        public int AddItemRemito(ItemRemito itemRemito)
        {
            int resultadoConsulta = 0;

            item_remitoTableAdapter itemRemitoTB = new item_remitoTableAdapter();

            itemRemitoTB.Connection.Open();
            MySqlTransaction transaccion = itemRemitoTB.Connection.BeginTransaction();

            try
            {
                
                int codigoEmpresa = itemRemito.CodigoEmpresa;
                int nroComprobante1 = itemRemito.NroComprobante1;
                int nroComprobante2 = itemRemito.NroComprobante2;
                byte codigoTipo = itemRemito.CodigoTipo;

                int codigoCategoriaArticulo = itemRemito.CodigoCategoriaArticulo;
                int codigoArticulo = itemRemito.CodigoArticulo;
                int codigoSubArticulo = itemRemito.CodigoSubArticulo;

                decimal cantidad = Convert.ToDecimal(itemRemito.Cantidad);
                decimal precioUnitario = itemRemito.PrecioUnitario;
                decimal iva = Convert.ToDecimal(itemRemito.Iva);
                int pos = itemRemito.Posicion;

                resultadoConsulta = itemRemitoTB.InsertItemRemito(codigoEmpresa, (short)nroComprobante1, nroComprobante2, codigoTipo, (short)codigoCategoriaArticulo, (short)codigoArticulo, (short)codigoSubArticulo, cantidad, precioUnitario, iva, pos);

                transaccion.Commit();
            }
            catch (Exception e)
            {
                transaccion.Rollback();
                MessageBox.Show("Error AddItemsRemito - ItemRemitoDB" + e.Message, "Cuidado", MessageBoxButton.OK);
            }
            finally
            {
                itemRemitoTB.Connection.Close();
            }

            return resultadoConsulta;
        }

        public List<ItemRemito> ObternerItemsSegunCodigo(short nro1, int nro2, byte tipo)
        {
            List<ItemRemito> resultado = new List<ItemRemito>();

            item_remitoTableAdapter itemsTB = new item_remitoTableAdapter();

            itemsTB.Connection.Open();
            MySqlTransaction transaccion = itemsTB.Connection.BeginTransaction();

            try
            {
                int codigoEmpresa = empresa.CodigoEmpresa;

                DataTable resultadoConsulta = itemsTB.GetDataByObtenerItemsRemitoPorCodigo(codigoEmpresa, nro1, nro2, tipo);

                if (resultadoConsulta.Rows.Count > 0)
                {
                    foreach (DataRow item in resultadoConsulta.Rows)
                    {
                        ItemRemito itemRemito = new ItemRemito();

                        itemRemito.CodigoEmpresa = Convert.ToInt16(item["codigo_empresa"].ToString());
                        itemRemito.NroComprobante1 = Convert.ToInt16(item["nro_comprobante1"].ToString());
                        itemRemito.NroComprobante2 = Convert.ToInt16(item["nro_comprobante2"].ToString());
                        itemRemito.CodigoTipo = Convert.ToByte(item["codigoTipo"]);

                        itemRemito.CodigoCategoriaArticulo = Convert.ToInt16(item["codigo_Categoria_Art"].ToString());
                        itemRemito.CodigoArticulo = Convert.ToInt16(item["codigo_Articulo"].ToString());
                        itemRemito.CodigoSubArticulo = Convert.ToInt16(item["codigo_subArticulo"].ToString());

                        itemRemito.CodigoUniArticulo = itemRemito.CodigoCategoriaArticulo + "-" + itemRemito.CodigoArticulo + "-" + itemRemito.CodigoSubArticulo;

                        itemRemito.Cantidad = Convert.ToDouble(item["cantidad"].ToString());
                        itemRemito.PrecioUnitario = Convert.ToDecimal(item["precio"].ToString());
                        itemRemito.Iva = Convert.ToDouble(item["iva"].ToString());
                        itemRemito.Posicion = Convert.ToInt16(item["Posicion"].ToString());

                        double precioUnitario = Convert.ToDouble(itemRemito.PrecioUnitario);
                        double iva = itemRemito.Iva;
                        itemRemito.PrecioTotal = Convert.ToDouble(itemRemito.Cantidad * (precioUnitario + (precioUnitario * (iva / 100))));

                        SubArticulo subArticulo = articuloDB.ObtenerSubArticulo(itemRemito.CodigoSubArticulo, itemRemito.CodigoArticulo, itemRemito.CodigoCategoriaArticulo);
                        itemRemito.Descripcion = subArticulo.CategoriaDescripcion + "-" + subArticulo.ArticuloDescripcion + "-" + subArticulo.Descripcion;

                        resultado.Add(itemRemito);
                    }
                }
            }
            catch (Exception e)
            {
                transaccion.Rollback();
                MessageBox.Show("Error ObternerItemsSegunCodigo(short nro1, int nro2, byte tipo) - ItemRemitoDB --> " + e.Message, "Cuidado", MessageBoxButton.OK);
            }
            finally
            {
                itemsTB.Connection.Close();
            }

            return resultado;

        }

        private int UpdateItemsRemito(ItemRemito itemRemito)
        {
            int resultadoConsulta = 0;

            item_remitoTableAdapter itemRemitoTB = new item_remitoTableAdapter();

            itemRemitoTB.Connection.Open();
            MySqlTransaction transaccion = itemRemitoTB.Connection.BeginTransaction();

            try
            {
                int codigoEmpresa = itemRemito.CodigoEmpresa;
                short nroComprobante1 = (short)itemRemito.NroComprobante1;
                int nroComprobante2 = itemRemito.NroComprobante2;
                byte codigoTipo = itemRemito.CodigoTipo;

                int codigoCategoriaArticulo = itemRemito.CodigoCategoriaArticulo;
                int codigoArticulo = itemRemito.CodigoArticulo;
                int codigoSubArticulo = itemRemito.CodigoSubArticulo;

                decimal cantidad = Convert.ToDecimal(itemRemito.Cantidad);
                decimal precioUnitario = itemRemito.PrecioUnitario;
                decimal iva = Convert.ToDecimal(itemRemito.Iva);
                int pos = itemRemito.Posicion;

                ItemRemito aux = ObtenerItemRemitoPorCodigo_Y_Posicion(codigoEmpresa, nroComprobante1, nroComprobante2, codigoTipo, pos);

                if (aux.Posicion == -1)
                {
                    resultadoConsulta = AddItemRemito(itemRemito);
                }
                else
                {
                    resultadoConsulta = itemRemitoTB.UpdateItemRemito((short)codigoCategoriaArticulo, (short)codigoArticulo, (short)codigoSubArticulo, cantidad, precioUnitario, iva, codigoEmpresa, nroComprobante1, nroComprobante2, codigoTipo, pos);
                }

                

                transaccion.Commit();

            }
            catch (Exception e)
            {
                transaccion.Rollback();
                MessageBox.Show("Error UpdateItemsRemito - ItemRemitoDB" + e.Message, "Cuidado", MessageBoxButton.OK);
            }
            finally
            {
                itemRemitoTB.Connection.Close();
            }

            return resultadoConsulta;
        }

        public int EliminarItemRemito(ItemRemito itemRemito)
        {
            int resultado = 0;

            item_remitoTableAdapter itemTB = new item_remitoTableAdapter();

            itemTB.Connection.Open();

            MySqlTransaction transaccion = itemTB.Connection.BeginTransaction();

            try
            {
                int codigoEmpresa = itemRemito.CodigoEmpresa;
                short nro1 = (short)itemRemito.NroComprobante1;
                int nro2 = itemRemito.NroComprobante2;
                byte tipo = itemRemito.CodigoTipo;
                int pos = itemRemito.Posicion;

                resultado = itemTB.DeleteItemRemito(codigoEmpresa, nro1, nro2, tipo, pos);

                transaccion.Commit();

                ActualizarPosicionItemsRemito(codigoEmpresa, nro1, nro2, tipo, pos);
            }
            catch (Exception e)
            {
                transaccion.Rollback();
                MessageBox.Show("Error EliminarItemRemito - ItemRemitoDB" + e.Message, "Cuidado", MessageBoxButton.OK);
            }
            finally
            {
                itemTB.Connection.Close();
            }

            return resultado;
        }

        #endregion

        #region Methods

        public int UpdateItemsRemito(List<ItemRemito> itemsRemito)
        {
            int resultadoConsulta = 0;

            foreach (ItemRemito itemRemito in itemsRemito)
            {
                resultadoConsulta = UpdateItemsRemito(itemRemito);
            }

            return resultadoConsulta;
        }

        public ItemRemito ObtenerItemRemitoPorCodigo_Y_Posicion(int codigoEmpresa, short nro1, int nro2, byte tipo, int pos)
        {
            ItemRemito resultado = new ItemRemito();

            item_remitoTableAdapter itemTB = new item_remitoTableAdapter();

            itemTB.Connection.Open();

            MySqlTransaction transaccion = itemTB.Connection.BeginTransaction();

            try
            {
                DataTable resultadoConsulta = itemTB.GetDataByObtenerItemRemitoPorCodigo_Y_Posicion(codigoEmpresa, nro1, nro2, tipo, pos);

                if (resultadoConsulta.Rows.Count > 0)
                {
                    foreach (DataRow item in resultadoConsulta.Rows)
                    {
                        resultado.CodigoEmpresa = Convert.ToInt16(item["codigo_empresa"].ToString());
                        resultado.NroComprobante1 = Convert.ToInt16(item["nro_comprobante1"].ToString());
                        resultado.NroComprobante2 = Convert.ToInt16(item["nro_comprobante2"].ToString());
                        resultado.CodigoTipo = Convert.ToByte(item["codigoTipo"]);

                        resultado.CodigoCategoriaArticulo = Convert.ToInt16(item["codigo_Categoria_Art"].ToString());
                        resultado.CodigoArticulo = Convert.ToInt16(item["codigo_Articulo"].ToString());
                        resultado.CodigoSubArticulo = Convert.ToInt16(item["codigo_subArticulo"].ToString());

                        resultado.CodigoUniArticulo = resultado.CodigoCategoriaArticulo + " - " + resultado.CodigoArticulo + " - " + resultado.CodigoSubArticulo;

                        resultado.Cantidad = Convert.ToDouble(item["cantidad"].ToString());
                        resultado.PrecioUnitario = Convert.ToDecimal(item["precio"].ToString());
                        resultado.Iva = Convert.ToDouble(item["iva"].ToString());
                        resultado.Posicion = Convert.ToInt16(item["Posicion"].ToString());

                        double precioUnitario = Convert.ToDouble(resultado.PrecioUnitario);
                        double iva = resultado.Iva;
                        resultado.PrecioTotal = Convert.ToDouble(resultado.Cantidad * (precioUnitario + (precioUnitario * (iva / 100))));

                        SubArticulo subArticulo = articuloDB.ObtenerSubArticulo(resultado.CodigoSubArticulo, resultado.CodigoArticulo, resultado.CodigoCategoriaArticulo);
                        resultado.Descripcion = subArticulo.CategoriaDescripcion + " - " + subArticulo.ArticuloDescripcion + " - " + subArticulo.Descripcion;
                    }
                }
                else
                {
                    resultado.Posicion = -1;
                }
            }
            catch (Exception e)
            {
                transaccion.Rollback();
                MessageBox.Show("Error ObtenerItemRemitoPorCodigo_Y_Posicion - ItemRemitoDB" + e.Message, "Cuidado", MessageBoxButton.OK);
            }
            finally
            {
                itemTB.Connection.Close();
            }

            return resultado;
        }

        //Obtiene una lista de items de remito mayores que la posicion que se pasa
        public List<ItemRemito> ObtenerItemRemitoPorCodigo_Y_PosicionMayor(int codigoEmpresa, short nro1, int nro2, byte tipo, int pos)
        {
            List<ItemRemito> resultado = new List<ItemRemito>();

            item_remitoTableAdapter itemTB = new item_remitoTableAdapter();

            itemTB.Connection.Open();

            MySqlTransaction transaccion = itemTB.Connection.BeginTransaction();

            try
            {
                DataTable resultadoConsulta = itemTB.GetDataByObtenerItemRemitoPorCodigo_Y_PosicionMayor(codigoEmpresa, nro1, nro2, tipo, pos);

                if (resultadoConsulta.Rows.Count > 0)
                {
                    foreach (DataRow item in resultadoConsulta.Rows)
                    {
                        ItemRemito aux = new ItemRemito();

                        aux.CodigoEmpresa = Convert.ToInt16(item["codigo_empresa"].ToString());
                        aux.NroComprobante1 = Convert.ToInt16(item["nro_comprobante1"].ToString());
                        aux.NroComprobante2 = Convert.ToInt16(item["nro_comprobante2"].ToString());
                        aux.CodigoTipo = Convert.ToByte(item["codigoTipo"]);

                        aux.CodigoCategoriaArticulo = Convert.ToInt16(item["codigo_Categoria_Art"].ToString());
                        aux.CodigoArticulo = Convert.ToInt16(item["codigo_Articulo"].ToString());
                        aux.CodigoSubArticulo = Convert.ToInt16(item["codigo_subArticulo"].ToString());

                        aux.CodigoUniArticulo = aux.CodigoCategoriaArticulo + " - " + aux.CodigoArticulo + " - " + aux.CodigoSubArticulo;

                        aux.Cantidad = Convert.ToDouble(item["cantidad"].ToString());
                        aux.PrecioUnitario = Convert.ToDecimal(item["precio"].ToString());
                        aux.Iva = Convert.ToDouble(item["iva"].ToString());
                        aux.Posicion = Convert.ToInt16(item["Posicion"].ToString());

                        double precioUnitario = Convert.ToDouble(aux.PrecioUnitario);
                        double iva = aux.Iva;
                        aux.PrecioTotal = Convert.ToDouble(aux.Cantidad * (precioUnitario + (precioUnitario * (iva / 100))));

                        SubArticulo subArticulo = articuloDB.ObtenerSubArticulo(aux.CodigoSubArticulo, aux.CodigoArticulo, aux.CodigoCategoriaArticulo);
                        aux.Descripcion = subArticulo.CategoriaDescripcion + " - " + subArticulo.ArticuloDescripcion + " - " + subArticulo.Descripcion;

                        resultado.Add(aux);
                    }
                }
                else
                {
                    resultado.Clear();
                }
            }
            catch (Exception e)
            {
                transaccion.Rollback();
                MessageBox.Show("Error ObtenerItemRemitoPorCodigo_Y_PosicionMayor - ItemRemitoDB" + e.Message, "Cuidado", MessageBoxButton.OK);
            }
            finally
            {
                itemTB.Connection.Close();
            }

            return resultado;
        }

        private void ActualizarPosicionItemsRemito(int codigoEmpresa, short nro1, int nro2, byte tipo, int pos)
        {

            List<ItemRemito> auxiliar = ObtenerItemRemitoPorCodigo_Y_PosicionMayor(codigoEmpresa, nro1, nro2, tipo, pos);

            if (auxiliar.Count > 0)
            {
                foreach (ItemRemito item in auxiliar)
                {
                    UpdatePosicionItemRemito(item, item.Posicion - 1);
                }
            }
        }

        private void UpdatePosicionItemRemito(ItemRemito itemRemito, int nuevaPosicion)
        {
            int resultadoConsulta = 0;

            item_remitoTableAdapter itemRemitoTB = new item_remitoTableAdapter();

            itemRemitoTB.Connection.Open();
            MySqlTransaction transaccion = itemRemitoTB.Connection.BeginTransaction();

            try
            {
                int codigoEmpresa = itemRemito.CodigoEmpresa;
                short nroComprobante1 = (short)itemRemito.NroComprobante1;
                int nroComprobante2 = itemRemito.NroComprobante2;
                byte codigoTipo = itemRemito.CodigoTipo;

                int pos = itemRemito.Posicion;

                resultadoConsulta = itemRemitoTB.UpdatePosicionItemRemito(nuevaPosicion, codigoEmpresa, nroComprobante1, nroComprobante2, codigoTipo, pos);

                transaccion.Commit();

            }
            catch (Exception e)
            {
                transaccion.Rollback();
                MessageBox.Show("Error UpdatePosicionItemRemito - ItemRemitoDB" + e.Message, "Cuidado", MessageBoxButton.OK);
            }
            finally
            {
                itemRemitoTB.Connection.Close();
            }
        }

        public void EliminarItems(List<ItemRemito> items)
        {
            if (items.Count > 0)
            {
                foreach (ItemRemito item in items)
                {
                    EliminarItemRemito(item);
                }
            }
        }
        #endregion
    }
}
